/**
 * Copyright (c) [2025] [AGIROS] 
 * [travoddsgen] is licensed under Mulan PSL v2. 
 * You can use this software according to the terms and conditions of the Mulan PSL v2. 
 * You may obtain a copy of Mulan PSL v2 at: 
 *          http://license.coscl.org.cn/MulanPSL2 
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 
 * See the Mulan PSL v2 for more details.
 */ 

#ifndef astvisitor_h__
#define astvisitor_h__

class ASTNode;
template <typename T> class ListNode;
class DefinitionNode;
class SpecificationNode;
class ModuleDclNode;
class ScopedNameNode;
class ConstDclNode;
class ConstTypeNode;
class ConstExprNode;
class OrExprNode;
class XorExprNode;
class AndExprNode;
class ShiftExprNode;
class AddExprNode;
class MultExprNode;
class UnaryExprNode;
class PrimaryExprNode;
class LiteralNode;
class PositiveIntConstNode;
class TypeDclNode;
class ConstrTypeDclNode;
class TypeSpecNode;
class SimpleTypeSpecNode;
class TemplateTypeSpecNode;
class BaseTypeNode;
class SequenceTypeNode;
class StringTypeNode;
class WideStringTypeNode;
class FixedPtTypeNode;
class MapTypeNode;
class StructDclNode;
class StructDefNode;
class TypeAnnotationNode;
class MemberNode;
class FixedArraySizeNode;
class MemberAnnotationNode;
class StructForwardDclNode;
class UnionDclNode;
class UnionDefNode;
class SwitchTypeSpecNode;
class CaseNode;
class CaseLabelNode;
class UnionForwardDclNode;
class EnumDclNode;
class EnumeratorNode;
class TypeDefDclNode;
class IncludeDclNode;

class AstVisitor {
public:
    virtual void visit(ASTNode& node) = 0;
    virtual void visit(ListNode<DefinitionNode*>& node) = 0;
    virtual void visit(SpecificationNode& node) = 0;
    virtual void visit(ModuleDclNode& node) = 0;
    virtual void visit(ScopedNameNode& node) = 0;
    virtual void visit(ConstDclNode& node) = 0;
    virtual void visit(ConstTypeNode& node) = 0;
    virtual void visit(ConstExprNode& node) = 0;
    virtual void visit(OrExprNode& node) = 0;
    virtual void visit(XorExprNode& node) = 0;
    virtual void visit(AndExprNode& node) = 0;
    virtual void visit(ShiftExprNode& node) = 0;
    virtual void visit(AddExprNode& node) = 0;
    virtual void visit(MultExprNode& node) = 0;
    virtual void visit(UnaryExprNode& node) = 0;
    virtual void visit(PrimaryExprNode& node) = 0;
    virtual void visit(LiteralNode& node) = 0;
    virtual void visit(PositiveIntConstNode& node) = 0;
    virtual void visit(TypeDclNode& node) = 0;
    virtual void visit(ConstrTypeDclNode& node) = 0;
    virtual void visit(TypeSpecNode& node) = 0;
    virtual void visit(SimpleTypeSpecNode& node) = 0;
    virtual void visit(TemplateTypeSpecNode& node) = 0;
    virtual void visit(BaseTypeNode& node) = 0;
    virtual void visit(SequenceTypeNode& node) = 0;
    virtual void visit(StringTypeNode& node) = 0;
    virtual void visit(WideStringTypeNode& node) = 0;
    virtual void visit(FixedPtTypeNode& node) = 0;
    virtual void visit(MapTypeNode& node) = 0;
    virtual void visit(StructDclNode& node) = 0;
    virtual void visit(StructDefNode& node) = 0;
    virtual void visit(ListNode<TypeAnnotationNode*>& node) = 0;
    virtual void visit(TypeAnnotationNode& node) = 0;
    virtual void visit(MemberNode& node) = 0;
    virtual void visit(ListNode<MemberNode*>& node) = 0;
    virtual void visit(ListNode<FixedArraySizeNode*>& node) = 0;
    virtual void visit(FixedArraySizeNode& node) = 0;
    virtual void visit(MemberAnnotationNode& node) = 0;
    virtual void visit(ListNode<MemberAnnotationNode*>& node) = 0;
    virtual void visit(StructForwardDclNode& node) = 0;
    virtual void visit(UnionDclNode& node) = 0;
    virtual void visit(UnionDefNode& node) = 0;
    virtual void visit(SwitchTypeSpecNode& node) = 0;
    virtual void visit(ListNode<CaseNode*>& node) = 0;
    virtual void visit(CaseNode& node) = 0;
    virtual void visit(ListNode<CaseLabelNode*>& node) = 0;
    virtual void visit(CaseLabelNode& node) = 0;
    virtual void visit(UnionForwardDclNode& node) = 0;
    virtual void visit(EnumDclNode& node) = 0;
    virtual void visit(ListNode<EnumeratorNode*>& node) = 0;
    virtual void visit(EnumeratorNode& node) = 0;
    virtual void visit(TypeDefDclNode& node) = 0;
    virtual void visit(IncludeDclNode& node) = 0;
};

#endif // astvisitor_h__